package com.audaque.springboot.foshanupload.web.mbdemo.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**跟hibernate类似*/
public class MyBatisUtil {
	//私有化构造方法
	private MyBatisUtil(){}
	private static SqlSessionFactory sqlSessionFactory=null;
	//SessionFactory是线程安全的,SessionFactory的创建需要很大的系统开销,实际上,在创建sessionFactory的时候才会去连接数据库,一般的,针对一个应用,一个数据库服务器,只需要一个SessionFactory实例就够了.
	//使用静态代码块加载
	static{
		try {

			//将db.properties读取到内存中,方式1：
			//Properties properties=new Properties();
			//properties.load(Resources.getResourceAsStream("db.properties"));
			//需要创建SqlSessionFactory
			sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.cfg.xml"));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	/*
	1).openSession:这个方法代表,开启一个全新的Session(测试环境)
    1.全新的连接
    2.全新的事务
    3.全新的一级缓存
    2).getCurrentSession:得到当前上下文中的session,绑定到当前线程.(开发环境)
    1.如果当前上下文中存在session,则使用该session;
    2.如果当前上下文中不存在session,则使用opensession创建一个新的session;
    3.要使用getCurrentSessoin,必须在hibernate.cfg.xml中配置
    <property name="hibernate.current_session_context_class">thread</property>
    4.getCurrentSession得到的session是和事务绑定的(Spring集成Hibernate的方式)，要是同一个事务;
    1),无论是DML还是DQL ,都必须开启事务(设置事务的活动状态)
    2),当事务提交的时候,session就跟着关闭了.-->此时不需要人为的调用:session.close()
    3).我们平时在测试的时候,还是使用openSession就可以了,关于事务的解决到spring讲;
    */
	//getCurrentSession可以预先写配置和事务，不会影响openSession，只要使用getCurrentSession时把session.close()清楚即可
	//提供对外方法
	public static  SqlSession openSession(){
		//通过SqlSessionFactory 拿到SqlSession对象
		SqlSession sqlSession=sqlSessionFactory.openSession();
		return sqlSession;
	}

}

